// app.js
import authManager from './utils/auth.js'
import { userAPI } from './utils/api.js'

App({
  onLaunch() {
    console.log('精酿点餐系统启动')

    // 展示本地存储能力
    const logs = wx.getStorageSync('logs') || []
    logs.unshift(Date.now())
    wx.setStorageSync('logs', logs)

    // 计算安全区域高度
    this.calculateSafeAreaTop()

    // 检查登录状态
    this.checkLoginStatus()

    // 获取系统信息
    this.getSystemInfo()

    // 检查更新
    this.checkForUpdates()
  },

  onHide() {
    // 小程序退出时清除购物车和桌号缓存
    this.clearCartAndTableCache()
  },

  onShow() {
    console.log('App Show')
  },

  onError(error) {
    console.error('App Error:', error)
    // 可以在这里上报错误日志
  },

  // 检查登录状态
  checkLoginStatus() {
    const isLoggedIn = authManager.checkLoginStatus()
    if (isLoggedIn) {
      this.globalData.userInfo = authManager.userInfo
      this.globalData.isLoggedIn = true
      this.globalData.token = authManager.token
      console.log('用户已登录:', authManager.userInfo)
      console.log('Token:', authManager.token)
      console.log('RefreshToken:', authManager.refreshToken)
    } else {
      console.log('用户未登录')
      this.globalData.isLoggedIn = false
      this.globalData.userInfo = null
      this.globalData.token = null
    }
  },

  // 获取用户信息
  getUserInfo(code) {
    // 这里将来会调用后端API获取用户信息
    // wx.request({
    //   url: 'https://api.example.com/login',
    //   data: { code },
    //   success: (res) => {
    //     this.globalData.userInfo = res.data.userInfo
    //   }
    // })
  },

  /**
   * 动态计算安全区域顶部高度
   */
  calculateSafeAreaTop() {
    try {
      // 获取系统信息
      const systemInfo = wx.getSystemInfoSync()
      const { platform, statusBarHeight } = systemInfo
      
      // 获取胶囊按钮信息
      const menuButtonInfo = wx.getMenuButtonBoundingClientRect()
      
      let safeAreaTop = statusBarHeight
      
      if (platform === 'ios') {
        // iOS 设备：胶囊按钮顶部到状态栏底部的距离
        safeAreaTop = menuButtonInfo.top
      } else if (platform === 'android') {
        // Android 设备：胶囊按钮顶部到状态栏底部的距离
        safeAreaTop = menuButtonInfo.top
      }
      
      // 设置全局 CSS 变量
      wx.setStorageSync('safeAreaTop', safeAreaTop)
      
      // 动态设置 CSS 变量到页面
      this.setSafeAreaTopCSS(safeAreaTop)
      
      console.log('安全区域顶部高度计算完成:', {
        platform,
        statusBarHeight,
        menuButtonTop: menuButtonInfo.top,
        safeAreaTop
      })
      
    } catch (error) {
      console.error('计算安全区域高度失败:', error)
      // 使用默认值
      const defaultSafeAreaTop = 44
      wx.setStorageSync('safeAreaTop', defaultSafeAreaTop)
      this.setSafeAreaTopCSS(defaultSafeAreaTop)
    }
  },

  /**
   * 设置安全区域顶部高度的 CSS 变量
   */
  setSafeAreaTopCSS(safeAreaTop) {
    try {
      // 使用 wx.createSelectorQuery 获取页面元素并设置 CSS 变量
      const query = wx.createSelectorQuery()
      query.select('page').boundingClientRect((rect) => {
        if (rect) {
          // 通过 wx.setNavigationBarColor 或其他方式设置全局样式
          // 由于微信小程序的限制，我们通过存储到全局数据中供页面使用
          this.globalData.safeAreaTop = safeAreaTop
          
          // 触发自定义事件，让页面知道安全区域高度已更新
          const app = getApp()
          if (app) {
            app.globalData.safeAreaTop = safeAreaTop
          }
        }
      }).exec()
    } catch (error) {
      console.error('设置 CSS 变量失败:', error)
    }
  },

  /**
   * 清除购物车和桌号缓存
   */
  clearCartAndTableCache() {
    try {
      // 清除购物车数据
      wx.removeStorageSync('cart')
      this.globalData.cart = []
      
      // 清除桌号数据
      wx.removeStorageSync('tableId')
      wx.removeStorageSync('tableNo')
      
      console.log('已清除购物车和桌号缓存')
    } catch (error) {
      console.error('清除缓存失败:', error)
    }
  },

  // 获取系统信息
  getSystemInfo() {
    wx.getSystemInfo({
      success: (res) => {
        this.globalData.systemInfo = res

        // 获取菜单按钮位置信息
        const menuButtonInfo = wx.getMenuButtonBoundingClientRect()

        // 计算安全区域
        const safeArea = res.safeArea || {}
        const statusBarHeight = res.statusBarHeight || 0

        // 计算自定义导航栏高度（状态栏 + 胶囊按钮高度 + 间距）
        const navBarHeight = menuButtonInfo.bottom + menuButtonInfo.top - statusBarHeight
        const tabBarHeight = 50 // 底部TabBar高度

        this.globalData.safeAreaInfo = {
          statusBarHeight: statusBarHeight,
          navBarHeight: navBarHeight,
          tabBarHeight: tabBarHeight,
          menuButtonHeight: menuButtonInfo.height,
          menuButtonTop: menuButtonInfo.top,
          menuButtonRight: res.windowWidth - menuButtonInfo.right,
          safeAreaTop: safeArea.top || statusBarHeight,
          safeAreaBottom: res.windowHeight - (safeArea.bottom || res.windowHeight),
          windowHeight: res.windowHeight,
          windowWidth: res.windowWidth
        }

        // 设置安卓状态栏高度到CSS变量
        this.setAndroidStatusBarHeight(statusBarHeight)

        console.log('系统信息:', res)
        console.log('胶囊按钮信息:', menuButtonInfo)
        console.log('安全区域信息:', this.globalData.safeAreaInfo)
      }
    })
  },

  // 设置安卓状态栏高度
  setAndroidStatusBarHeight(height) {
    // 将状态栏高度存储到全局数据中，供页面使用
    this.globalData.androidStatusBarHeight = height

    // 设置到本地存储，供其他页面读取
    wx.setStorageSync('androidStatusBarHeight', height)

    console.log('设置安卓状态栏高度:', height)
  },

  // 检查小程序更新
  checkForUpdates() {
    if (wx.canIUse('getUpdateManager')) {
      const updateManager = wx.getUpdateManager()

      updateManager.onCheckForUpdate((res) => {
        if (res.hasUpdate) {
          console.log('发现新版本')
        }
      })

      updateManager.onUpdateReady(() => {
        wx.showModal({
          title: '更新提示',
          content: '新版本已经准备好，是否重启应用？',
          success: (res) => {
            if (res.confirm) {
              updateManager.applyUpdate()
            }
          }
        })
      })

      updateManager.onUpdateFailed(() => {
        console.error('新版本下载失败')
      })
    }
  },

  // 全局数据
  globalData: {
    userInfo: null,
    isLoggedIn: false, // 登录状态
    systemInfo: null,
    safeAreaInfo: null, // 安全区域信息
    safeAreaTop: 44, // 动态计算的安全区域顶部高度
    cart: [], // 购物车数据
    cartTotal: 0, // 购物车总价
    currentLocation: null, // 当前位置
    storeInfo: {
      name: 'OKEYDO',
      address: '上海市浦东新区陆家嘴金融中心',
      phone: '400-888-8888',
      hours: '10:00 - 22:00'
    },
    apiBaseUrl: 'https://okeydo.fourcats.online', // API基础URL
    version: '1.0.0'
  },

  // 全局方法
  // 显示加载中
  showLoading(title = '加载中...') {
    wx.showLoading({
      title,
      mask: true
    })
  },

  // 隐藏加载中
  hideLoading() {
    wx.hideLoading()
  },

  // 显示消息提示
  showToast(title, icon = 'success', duration = 2000) {
    wx.showToast({
      title,
      icon,
      duration
    })
  },

  // 显示确认对话框
  showConfirm(options) {
    return new Promise((resolve) => {
      wx.showModal({
        title: options.title || '提示',
        content: options.content || '',
        confirmText: options.confirmText || '确定',
        cancelText: options.cancelText || '取消',
        success: (res) => {
          resolve(res.confirm)
        }
      })
    })
  },

  // 格式化价格
  formatPrice(price) {
    return `¥${parseFloat(price).toFixed(2)}`
  },

  // 格式化时间
  formatTime(timestamp) {
    const date = new Date(timestamp)
    const year = date.getFullYear()
    const month = (date.getMonth() + 1).toString().padStart(2, '0')
    const day = date.getDate().toString().padStart(2, '0')
    const hour = date.getHours().toString().padStart(2, '0')
    const minute = date.getMinutes().toString().padStart(2, '0')

    return `${year}-${month}-${day} ${hour}:${minute}`
  },

  // 获取位置信息
  getLocation() {
    return new Promise((resolve, reject) => {
      wx.getLocation({
        type: 'gcj02',
        success: (res) => {
          this.globalData.currentLocation = {
            latitude: res.latitude,
            longitude: res.longitude
          }
          resolve(res)
        },
        fail: reject
      })
    })
  },

  // 清理过期数据
  cleanExpiredData() {
    try {
      // 清理过期的缓存数据
      const cacheKeys = ['userCache', 'productCache', 'orderCache']
      cacheKeys.forEach(key => {
        const data = wx.getStorageSync(key)
        if (data && data.expireTime && Date.now() > data.expireTime) {
          wx.removeStorageSync(key)
        }
      })
    } catch (error) {
      console.error('清理缓存失败:', error)
    }
  },

  // 全局登录检查方法
  checkLogin() {
    if (!this.globalData.isLoggedIn) {
      // 触发登录弹窗
      this.showLoginModal()
      return false
    }
    return true
  },

  // 显示登录弹窗
  showLoginModal() {
    // 通过事件总线触发登录弹窗
    if (this.loginModalComponent) {
      this.loginModalComponent.setData({ show: true })
    }
  },

  // 设置登录弹窗组件引用
  setLoginModalComponent(component) {
    this.loginModalComponent = component
  },

  // 测试refreshToken机制
  testRefreshToken() {
    console.log('开始测试refreshToken机制...')
    console.log('当前token:', authManager.getToken())
    console.log('当前refreshToken:', authManager.getRefreshToken())

    // 模拟token过期，调用一个需要认证的API
    userAPI.getUserProfile().then(result => {
      console.log('API调用成功:', result)
    }).catch(error => {
      console.log('API调用失败:', error)
    })
  },

  // 测试登录状态
  testLoginStatus() {
    console.log('测试登录状态...')
    const isLoggedIn = authManager.checkLoginStatus()
    console.log('登录状态:', isLoggedIn)
    console.log('认证管理器状态:', {
      isLoggedIn: authManager.isLoggedIn,
      hasToken: !!authManager.token,
      hasRefreshToken: !!authManager.refreshToken,
      hasUserInfo: !!authManager.userInfo
    })
    console.log('本地存储状态:', {
      token: wx.getStorageSync('token'),
      refreshToken: wx.getStorageSync('refreshToken'),
      userInfo: wx.getStorageSync('userInfo')
    })
    console.log('全局数据状态:', {
      isLoggedIn: this.globalData.isLoggedIn,
      hasUserInfo: !!this.globalData.userInfo,
      hasToken: !!this.globalData.token
    })
  },

  // 清除登录状态
  clearLoginStatus() {
    console.log('清除登录状态...')
    authManager.logout()
    console.log('登录状态已清除')
  },


})
